স্প্রিং ডেটা JPA এবং Hibernate-এ FetchType.LAZY এবং FetchType.EAGER হলো ডেটা লোডিং স্ট্র্যাটেজি যা Entity সম্পর্কিত ডেটা কীভাবে ডেটাবেজ থেকে রিট্রিভ করা হবে তা নির্ধারণ করে। এই দুইটি স্ট্র্যাটেজি মূলত @OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany অ্যানোটেশনের সাথে ব্যবহার করা হয়।
FetchType.LAZY
FetchType.LAZY এর মানে হলো ডেটা তখনই ডেটাবেজ থেকে রিট্রিভ করা হবে, যখন এটি প্রথমবার অ্যাক্সেস করা হবে। অর্থাৎ, সম্পর্কিত ডেটা শুধুমাত্র প্রয়োজনের সময় লোড করা হয়। এটি ডেটাবেস থেকে অপ্রয়োজনীয় ডেটা লোডিং এড়িয়ে কার্যক্ষমতা বাড়াতে সাহায্য করে।
ব্যবহার:
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
private List<Employee> employees;
// Getters and Setters
}
বৈশিষ্ট্য:
- সম্পর্কিত ডেটা রিফারেন্স করলে তখনই ডেটাবেজ থেকে ফেচিং হবে।
- পারফরম্যান্স বৃদ্ধি পায় কারণ প্রথমবার মেইন ডেটা লোড করার সময় সম্পর্কিত ডেটা লোড হয় না।
- ডেটাবেজ অ্যাক্সেসের সংখ্যা বৃদ্ধি পেতে পারে, যদি সম্পর্কিত ডেটা একাধিকবার প্রয়োজন হয়।
উদাহরণ:
Department department = departmentRepository.findById(1L).get();
// এই লাইন সম্পর্কিত Employee লোড করবে না
List<Employee> employees = department.getEmployees();
// এই লাইন Employee লোড করবে কারণ এখানে অ্যাক্সেস করা হচ্ছে
FetchType.EAGER
FetchType.EAGER এর মানে হলো Entity লোড করার সময় তার সম্পর্কিত ডেটাও সঙ্গে সঙ্গে ডেটাবেজ থেকে রিট্রিভ করা হবে। এটি তখন ব্যবহার করা হয় যখন সম্পর্কিত ডেটা প্রায়শই প্রয়োজন হয়।
ব্যবহার:
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
বৈশিষ্ট্য:
- মেইন ডেটা রিট্রিভ করার সময় সম্পর্কিত ডেটাও একসঙ্গে লোড হয়।
- পারফরম্যান্স কমে যেতে পারে যদি সম্পর্কিত ডেটা অনেক বড় এবং তা প্রয়োজন না হয়।
- ডেটাবেজ অ্যাক্সেসের সংখ্যা কমে যায় কারণ এটি একবারেই ডেটা লোড করে।
উদাহরণ:
Employee employee = employeeRepository.findById(1L).get();
// এই লাইন Employee এবং তার Department উভয়ই লোড করবে
Department department = employee.getDepartment();
FetchType.LAZY বনাম FetchType.EAGER
| বৈশিষ্ট্য | FetchType.LAZY | FetchType.EAGER |
|---|---|---|
| লোডিং সময় | ডেটা প্রথমবার প্রয়োজন হলে লোড হয়। | ডেটা Entity লোড করার সময় লোড হয়। |
| পারফরম্যান্স | কম মেমোরি ব্যবহার এবং দ্রুত লোডিং। | বড় সম্পর্কিত ডেটার ক্ষেত্রে ধীর হতে পারে। |
| ডেটাবেস অ্যাক্সেস | প্রয়োজন অনুসারে একাধিকবার অ্যাক্সেস। | একবারেই সম্পর্কিত ডেটা অ্যাক্সেস। |
| ব্যবহারযোগ্যতা | যখন সম্পর্কিত ডেটা কম ব্যবহৃত হয়। | যখন সম্পর্কিত ডেটা প্রায়শই ব্যবহৃত হয়। |
FetchType এর ব্যবহার স্থান নির্বাচন
- FetchType.LAZY:
- সম্পর্কিত ডেটা বড় হলে এবং তা খুব কম ব্যবহৃত হলে।
- যখন পারফরম্যান্স গুরুত্বপূর্ণ।
- ডেটা রিলেশনাল স্ট্রাকচারে কাজ করার সময়।
- FetchType.EAGER:
- যখন সম্পর্কিত ডেটা ছোট এবং প্রায়ই ব্যবহার হয়।
- সম্পর্কিত ডেটা অ্যাক্সেস নিশ্চিত করতে হবে।
ডিফল্ট ফেচ টাইপ
- @OneToMany এবং @ManyToMany: ডিফল্ট হলো FetchType.LAZY।
- @OneToOne এবং @ManyToOne: ডিফল্ট হলো FetchType.EAGER।
সারাংশ
FetchType.LAZY এবং FetchType.EAGER JPA এবং Hibernate-এ ডেটা লোডিং কৌশল নির্ধারণ করে। LAZY পারফরম্যান্স উন্নত করতে সাহায্য করে, যখন EAGER প্রয়োজনীয় ডেটা লোডিং নিশ্চিত করে। ব্যবহারের স্থান অনুযায়ী সঠিক FetchType নির্বাচন করা অ্যাপ্লিকেশনের কার্যকারিতা এবং রিসোর্স ব্যবহারের জন্য অত্যন্ত গুরুত্বপূর্ণ।
Read more